如何在没有事务的情况下将实体保存到数据库中?

How is the entity being saved to the database without a transaction?

我可以在 Spring 启动应用程序中保存没有 @Transactional 的实体。我只注意到这一点,因为我无法更新实体,直到我将 @Transactional 添加到 EmployeeService.java.

中的 save 方法

我没有在 class 级别注释 @Transactional。它唯一被发现的地方是我的服务层中不属于 save 方法的方法。我的 EmployeeDAO 没有扩展 JPARepository。它用 @Repository 注释。我有 spring-boot-starter-data-jpa 作为依赖项。我也没有手动开始或提交交易。

EmployeeRestController.java

@PostMapping("/employees")
public void addEmployee(@RequestBody Employee employee) {
    employee.setId(0);

    employeeService.save(employee);
}

EmployeeService.java

public void save(Employee employee) {
    emplDAO.save(employee);
}

EmployeeDAO.java

@Override
public void save(Employee employee) {
    Session currentSession = em.unwrap(Session.class);

    currentSession.saveOrUpdate(employee);
}

默认情况下 Spring 启动 Web 应用程序 spring.jpa.open-in-view 设置为 true

很有可能是这个原因

来自Spring Boot Reference Guide

If you are running a web application, Spring Boot by default registers OpenEntityManagerInViewInterceptor to apply the “Open EntityManager in View” pattern, to allow for lazy loading in web views. If you do not want this behavior, you should set spring.jpa.open-in-view to false in your application.properties.

另见: